package belf.migrate.api.table.schema;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;

/** 表的外键元数据 */
@Data
@AllArgsConstructor
public class ForeignKey implements Serializable {
    private static final long serialVersionUID = 37L;
    /** 被引用表所属的catglog */
    private final String pkCatalog;
    /** 被引用表所属的schema */
    private final String pkSchema;
    /** 被引用表的名称 */
    private final String pkTable;
    /** 被引用表中的对应字段 */
    private final String pkColumnName;

    /** 当前表的名称 */
    private final String fkTable;
    /** 当前表的外键字段 */
    private final String fkColumnName;
    /** 外键名称，从源数据库的表中获取，在目标数据库中作为索引名称去创建索引 */
    private final String fkName;

    /** 外键关联的更新规则 */
    private final ConstraintAction updateRule;
    /** 外键关联的删除规则 */
    private final ConstraintAction deleteRule;

    /**
     * 字段的限制条件对应的动作。参考微软官方文档：
     * https://learn.microsoft.com/en-us/sql/connect/jdbc/reference/getimportedkeys-method-sqlserverdatabasemetadata?view=sql-server-ver16
     */
    public enum ConstraintAction {
        CASCADE(0, "CASCADE"),
        RESTRICT(1, "RESTRICT"),
        SET_NULL(2, "SET NULL"),
        NO_ACTION(3, ""), // NO ACTION，在创建外键的SQL语句中没有作用
        SET_DEFAULT(4, "SET DEFAULT");

        private final int value;
        private final String expression;

        ConstraintAction(int value, String expression) {
            this.value = value;
            this.expression = expression;
        }

        public int getValue() {
            return value;
        }

        public String getExpression() {
            return expression;
        }

        public static ConstraintAction byValue(short value) {
            switch (value) {
                case 0: return CASCADE;
                case 1: return RESTRICT;
                case 2: return SET_NULL;
                case 4: return SET_DEFAULT;
                default: return NO_ACTION;
            }

        }
    }
}
